Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tooltip: add placement prop to replace deprecated position #54264

Merged
merged 9 commits into from
Sep 18, 2023

Conversation

brookewp
Copy link
Contributor

@brookewp brookewp commented Sep 8, 2023

Part of #44401

What?

Similar to changes in Popover, the use of floating-ui in Tooltip brings a new prop for positioning, placement.

Why?

Currently, Tooltip uses the position prop, which we will be replacing with placement. This starts the deprecation process so we can slowly introduce placement to avoid breaking changes.

How?

By exposing placement, updating the logic to favor placement over position, adding deprecation warnings, updating types and the README. As well as updating internal uses of position to placement.

Testing Instructions

Ensure unit tests are passing and don't show unexpected console.warn errors

Smoke tests

npm run storybook:dev

Tooltip

  • Select a position for tooltip and check that the error appears in the console
  • Choose a different option for placement to ensure it takes precedence over position.

Button

  • Enable showTooltip and add a label.
  • Ensure the default is bottom.
  • Try changing tooltipPosition to other options to ensure the tooltip displays where expected.

Others

  • Smoke test other components where the position was changed to placement. Ensure that results match trunk. I highlight this because some positions appear incorrect, but the behavior is the same. i.e. ToggleGroupControl

What position: top looks like in trunk:

Screenshot 2023-09-13 at 1 44 22 PM

And if we experiment and change to bottom right:
Screenshot 2023-09-13 at 1 44 09 PM

Something strange is happening here, so I'll add a to-do item for it.

  • i.e. BoxControl* (unlinked side units) and DateTimePicker (UTC text) can be tested in storybook.
Screenshot 2023-09-13 at 1 28 54 PM

*Side note: Will also add a to-do follow up for BoxControl:
First, in the screenshot above, the tooltip overlaps, which doesn't seem ideal. But also, a custom implementation of Tooltip has been added as BaseTooltip which I believe is worth looking into.

@brookewp brookewp added the [Package] Components /packages/components label Sep 8, 2023
@brookewp brookewp self-assigned this Sep 8, 2023
@brookewp brookewp added the [Type] Enhancement A suggestion for improvement. label Sep 8, 2023
@github-actions
Copy link

github-actions bot commented Sep 8, 2023

Flaky tests detected in c26f863.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/6191995244
📝 Reported issues:

Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice 👍 I'm just leaving some drive-by comments.

if ( position !== undefined ) {
deprecated( '`position` prop in wp.components.tooltip', {
since: '6.4',
alternative: '`placement` prop',
} );
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have this if ( position !== undefined ) condition above already, so perhaps we can just move the deprecated() call there, instead of duplicating the check?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I borrowed the logic from the same changes made to URLPopover. Do you think it's worth following up there as well with your suggestions?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Feel free to follow up in another PR, although it's not a huge deal, just a minor code style preference.

} else if ( position !== undefined ) {
computedPlacement = positionToPlacement( position );
}
computedPlacement = computedPlacement || DEFAULT_PLACEMENT;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we could just inline the default placement, no need to have a constant when it's only used once and in just a few lines below in the same function.

@@ -35,12 +35,21 @@ The amount of time in milliseconds to wait before showing the tooltip.
- Required: No
- Default: `700`

#### `placement`: `'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end'`

Used to specify the tooltip's position with respect to its anchor.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add a reference to the placement docs:

https://floating-ui.com/docs/tutorial#placements

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I grabbed this from Popover's README for consistency:

### `placement`: `'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'overlay'`
Used to specify the popover's position with respect to its anchor.

So maybe we'd want to add the link there, too? And after mentioning URLPopover above, I looked at the README on placement:

### placement
Where the Popover should be positioned relative to its parent. Defaults to "bottom".
- Type: `String`
- Required: No
- Default: "bottom"

So I wonder if we should follow up with these and other components moving towards placement.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds like a good documentation improvement 👍 If these are coming from an external library, then IMHO it makes a lot of sense to link to the original library's documentation.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The counter-argument to that, is that we're exposing our internal implementation in our docs. We usually avoid doing this as it gives us more flexibility in changing underlying implementation (like when Popover was refactored from popper to floating-ui last year)

packages/components/src/tooltip/index.tsx Show resolved Hide resolved
@github-actions
Copy link

github-actions bot commented Sep 12, 2023

Size Change: -937 B (0%)

Total Size: 1.62 MB

Filename Size Change
build/block-directory/index.min.js 7.03 kB +16 B (0%)
build/block-editor/index.min.js 217 kB +223 B (0%)
build/block-library/blocks/image/view-interactivity.min.js 0 B -1.83 kB (removed) 🏆
build/block-library/index.min.js 205 kB +281 B (0%)
build/blocks/index.min.js 51.3 kB -47 B (0%)
build/commands/index.min.js 15.5 kB +10 B (0%)
build/components/index.min.js 255 kB +123 B (0%)
build/edit-post/index.min.js 35.5 kB +9 B (0%)
build/edit-site/index.min.js 181 kB +151 B (0%)
build/editor/index.min.js 45.6 kB +5 B (0%)
build/format-library/index.min.js 7.72 kB +17 B (0%)
build/patterns/index.min.js 3.35 kB +109 B (+3%)
build/primitives/index.min.js 975 B +32 B (+3%)
build/rich-text/index.min.js 10.2 kB -35 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.69 kB
build/block-library/blocks/cover/style.css 1.68 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 318 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view.min.js 1.83 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view.min.js 984 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 375 B
build/block-library/blocks/query/style.css 372 B
build/block-library/blocks/query/view.min.js 555 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 468 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.2 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 13.9 kB
build/block-library/style.css 13.9 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.6 kB
build/core-data/index.min.js 17 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.48 kB
build/customize-widgets/style.css 1.48 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.84 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/style-rtl.css 7.84 kB
build/edit-post/style.css 7.83 kB
build/edit-site/style-rtl.css 13.8 kB
build/edit-site/style.css 13.8 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.8 kB
build/edit-widgets/style.css 4.79 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 11.3 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/style-rtl.css 302 B
build/patterns/style.css 302 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.97 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@brookewp
Copy link
Contributor Author

@tyxla @ciampo - I've updated some of the failing tests to include an expect warning assertion. There are two more failing tests which still need to be updated but:

  1. I wanted to ensure the first few tests I've updated so far is the expected way to handle adding the deprecation warning.
  2. The failing tests are both test.each cases. The first set of conditions expects a warning, and the other doesn't. For packages/components/src/font-size-picker/test/index.tsx, we could easily separate the test.each into single tests.
diff --git a/packages/components/src/font-size-picker/test/index.tsx b/packages/components/src/font-size-picker/test/index.tsx
index 0d7816399b..b83a4a11be 100644
--- a/packages/components/src/font-size-picker/test/index.tsx
+++ b/packages/components/src/font-size-picker/test/index.tsx
@@ -36,32 +36,48 @@ describe( 'FontSizePicker', () => {
 		}
 	);
 
-	test.each( [
-		// Use units when first font size uses units.
-		{ firstFontSize: '12px', expectedValue: '80px' },
-		// Don't use units when first font size does not use units.
-		{ firstFontSize: 12, expectedValue: 80 },
-	] )(
-		'should call onChange( $expectedValue ) after user types 80 when first font size is $firstFontSize',
-		async ( { firstFontSize, expectedValue } ) => {
-			const user = userEvent.setup();
-			const onChange = jest.fn();
-			render(
-				<FontSizePicker
-					__nextHasNoMarginBottom
-					fontSizes={ [ { slug: 'slug', size: firstFontSize } ] }
-					onChange={ onChange }
-				/>
-			);
-			await user.click(
-				screen.getByRole( 'button', { name: 'Set custom size' } )
-			);
-			const input = screen.getByLabelText( 'Custom' );
-			await user.type( input, '80' );
-			expect( onChange ).toHaveBeenCalledTimes( 2 ); // Once per keystroke.
-			expect( onChange ).toHaveBeenCalledWith( expectedValue );
-		}
-	);
+	test( 'should call onChange( 80px ) after user types 80 when first font size is 12px', async () => {
+		const user = userEvent.setup();
+		const onChange = jest.fn();
+		render(
+			<FontSizePicker
+				__nextHasNoMarginBottom
+				fontSizes={ [ { slug: 'slug', size: '12px' } ] }
+				onChange={ onChange }
+			/>
+		);
+		await user.click(
+			screen.getByRole( 'button', { name: 'Set custom size' } )
+		);
+		const input = screen.getByLabelText( 'Custom' );
+
+		await user.type( input, '80' );
+
+		expect( console ).toHaveWarned();
+		expect( onChange ).toHaveBeenCalledTimes( 2 ); // Once per keystroke.
+		expect( onChange ).toHaveBeenCalledWith( '80px' );
+	} );
+
+	test( 'should call onChange( 80 ) after user types 80 when first font size is 12', async () => {
+		const user = userEvent.setup();
+		const onChange = jest.fn();
+		render(
+			<FontSizePicker
+				__nextHasNoMarginBottom
+				fontSizes={ [ { slug: 'slug', size: 12 } ] }
+				onChange={ onChange }
+			/>
+		);
+		await user.click(
+			screen.getByRole( 'button', { name: 'Set custom size' } )
+		);
+		const input = screen.getByLabelText( 'Custom' );
+
+		await user.type( input, '80' );
+
+		expect( onChange ).toHaveBeenCalledTimes( 2 ); // Once per keystroke.
+		expect( onChange ).toHaveBeenCalledWith( 80 );
+	} );
 
 	describe( 'with > 5 homogeneous font sizes', () => {
 		const fontSizes = [

But in packages/components/src/toggle-group-control/test/index.tsx, it gets a bit messier. The easiest solution would be to add a conditional statement, but I saw it's not good practice to put expects in conditionals. I have seen a handful of tests in GB with an ignore // eslint-disable-next-line jest/no-conditional-expect, but I wanted to check to see if there were any other approaches I've missed. Although it would be as simple as adding the following (with a different condition for FontSizePicker` of course):

diff --git a/packages/components/src/toggle-group-control/test/index.tsx b/packages/components/src/toggle-group-control/test/index.tsx
index 78be0e89fc..d685833628 100644
--- a/packages/components/src/toggle-group-control/test/index.tsx
+++ b/packages/components/src/toggle-group-control/test/index.tsx
@@ -98,6 +98,11 @@ describe.each( [
 				</Component>
 			);
 
+			if ( mode === 'uncontrolled' ) {
+				// eslint-disable-next-line jest/no-conditional-expect
+				expect( console ).toHaveWarned();
+			}
+
 			expect( container ).toMatchSnapshot();
 		} );
 	} );

@ciampo
Copy link
Contributor

ciampo commented Sep 13, 2023

This is what i'd do:

  • I would update, in this PR, all consumers of Tooltip to use the placement prop instead of position:
    • when possible, we simply update the hardcoded values (for example, position="top center" becomes placement="top"
    • if, instead, the consumer is forwarding a prop (like Button, that forwards the value of tooltipPosition), then we can use the positionToPlacement utility function, and do something like placement={positionToPlacement(tooltipPosition)}
  • One we're done refactoring the consumers of Tooltip, the only tests that would need the expect( console ).toHaveWarned(); assertion should be the Tooltip tests (which should also avoid the issues flagged in the comment above)
  • As a follow-up to this PR, we can update those unit tests to also use the placement prop, and thus remove the expect( console ).toHaveWarned(); assertions

Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although I don't have strong feelings about it (we could alternatively follow up in additional PRs to replace all position with placement usages), I agree with the plan @ciampo proposed above, because that will help remove some of the warning inconsistencies we're seeing in the tests.

@brookewp
Copy link
Contributor Author

Thanks for the comments! I was hoping to replace internal usage in a second PR, but it seems cleaner to do it in this PR. That way we avoid adding warnings and rewriting tests temporarily to then be reverted in the follow-up PR.

@brookewp
Copy link
Contributor Author

@ciampo I noticed in similar instances where we added placement, we didn't add a CHANGELOG entry. I would have thought it would be under internal, but I'll wait on you to confirm which way to go.

@brookewp brookewp marked this pull request as ready for review September 13, 2023 20:54
@ciampo
Copy link
Contributor

ciampo commented Sep 14, 2023

@ciampo I noticed in similar instances where we added placement, we didn't add a CHANGELOG entry.

The specific example of URLPopover didn't require a CHANGELOG entry because that component is not part of the @wordpress/components package

I would have thought it would be under internal, but I'll wait on you to confirm which way to go.

Since we're adding a new public API to the Tooltip component, I'd argue that it not an internal change — I'd probably list it under a ### New Features section.

@ciampo ciampo changed the title Tooltip: add placement prop to replace position Tooltip: add placement prop to replace deprecated position Sep 14, 2023
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a couple of minor comments, but changes LGTM.

@chad1008 , would you be able to take a final look at this PR, including testing the updated usages of Tooltip across the block editor? Feel free to approve if things look good on your end

@@ -225,6 +226,13 @@ export function UnforwardedButton(
</button>
);

// use floating-ui's `placement` instead of legacy `position`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// use floating-ui's `placement` instead of legacy `position`
// Convert legacy `position` values to be used with the new `placement` prop

packages/components/src/tooltip/types.ts Show resolved Hide resolved
Copy link
Contributor

@chad1008 chad1008 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good and tests well to me! I left one small comment of my own, and it looks like @ciampo may have added a couple thoughts on wording/exposing internal implementation details, but that's all code comment stuff that shouldn't be any kind of blocker 😄 🚀 🚢

// Compute tooltip's placement:
// - give priority to `placement` prop, if defined
// - otherwise, compute it from the legacy `position` prop (if defined)
// - finally, fallback to the DEFAULT_PLACEMENT.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that we're inlining the default value, we can update this comment to say bottom instead of DEFAULT_PLACEMENT

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch!

@brookewp
Copy link
Contributor Author

Since we're adding a new public API to the Tooltip component, I'd argue that it not an internal change — I'd probably list it under a ### New Features section.

@ciampo do you think it would make sense for hideOnClick to be under ### New Features as well? I could move it when updating the changelog here

@tyxla
Copy link
Member

tyxla commented Sep 15, 2023

Noting that something went off with the latest merge from trunk - there seem to be some extra changes that we likely don't want as part of the PR.

@ciampo
Copy link
Contributor

ciampo commented Sep 15, 2023

do you think it would make sense for hideOnClick to be under ### New Features as well? I could move it when updating the changelog here

Yup, sounds good to me.

Noting that something went off with the latest merge from trunk - there seem to be some extra changes that we likely don't want as part of the PR.

Good catch. Let's fix that before merging.

@brookewp
Copy link
Contributor Author

Noting that something went off with the latest merge from trunk - there seem to be some extra changes that we likely don't want as part of the PR.

Great find! Thank you for looking out. 😄 I am trying to be friends with git merge over git rebase, but... 😕

I'll get that resolved along with the conflict and update the changelog.

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's wrap this up and merge 🚀

packages/components/src/tooltip/types.ts Outdated Show resolved Hide resolved
Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking great from my perspective too! 🚀

@brookewp brookewp merged commit b617b47 into trunk Sep 18, 2023
51 checks passed
@brookewp brookewp deleted the tooltip/deprecate-position branch September 18, 2023 18:07
@github-actions github-actions bot added this to the Gutenberg 16.7 milestone Sep 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
Status: Done 🎉
Development

Successfully merging this pull request may close these issues.

4 participants